<!DOCTYPE HTML>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<button id="button">Button</button>
<label id="label" for="button" style="display:none" aria-label="AriaLabel">Label</label>

<script>
test(function(t) {
    var axButton = accessibilityController.accessibleElementById("button");

    // Get the AXObject for the label indirectly, even though it's display:none.
    // Ensure that it's valid.
    var axLabel = axButton.nameElementAtIndex(0);
    assert_equals(axLabel.isValid, true);
    assert_equals(axLabel.role, 'AXRole: AXLabelText');

    // Now un-hide the label.
    var label = document.getElementById('label');
    label.style.display = "block";

    // Ensure that the previous AXObject we had for the label is now invalid, but if
    // we fetch an AXObject for it, we get a new valid object.
    var axLabel2 = axButton.nameElementAtIndex(0);
    assert_equals(axLabel.isValid, false);
    assert_equals(axLabel2.isValid, true);
    assert_equals(axLabel2.name, 'AriaLabel');
    assert_equals(axLabel.isEqual(axLabel2), false);

    // Now hide the label again.
    label.style.display = "none";
    // Check once more: the second AXObject is now invalid, but if we fetch
    // an AXObject for the label a third time, we get a valid object again.
    var axLabel3 = axButton.nameElementAtIndex(0);
    assert_equals(axLabel.isValid, false);
    assert_equals(axLabel2.isValid, false);
    assert_equals(axLabel3.isValid, true);
    assert_equals(axLabel3.role, 'AXRole: AXLabelText');
    assert_equals(axLabel.isEqual(axLabel3), false);
    assert_equals(axLabel2.isEqual(axLabel3), false);
}, "Accessibility objects for display:none elements");
</script>
